package br.com.itc.componentes.modulos
{
	import br.com.itc.componentes.Alerta;
	import br.com.itc.componentes.MostraCursor;
	import br.com.itc.componentes.containers.CanvasITC;
	import br.com.itc.componentes.dto.SCReqDTO;
	import br.com.itc.componentes.util.servico.ServicoJavaUtil;
	import br.com.itc.componentes.validacao.RealizarValidacao;
	
	import flash.events.MouseEvent;
	
	import mx.events.FlexEvent;
	import mx.rpc.events.ResultEvent;
	
	public class FormularioCadastro extends CanvasITC implements IFormularioCadastro
	{
		
		public static var MODO_INCLUIR: String = "MODO_INCLUIR";
		public static var MODO_ALTERAR: String = "MODO_ALTERAR";
		public static var MODO_VISUALIZAR: String = "MODO_VISUALIZAR";
		
		public static var OPERACAO_ALTERAR_DADOS: String = "alterarDados";
		public static var OPERACAO_INCLUIR_DADOS: String = "incluirDados";
		
		private var _janelaSelecao: ListaCadastro;
		
		private var _barraBotoes: BarraBotoesFormularioCadastro;
		
		private var _modo: String;
		
		private var _objetoSelecionado: Object;
		
		private var _destino: String;
		
		public function FormularioCadastro()
		{
			this.addEventListener(FlexEvent.CREATION_COMPLETE, init);
		}
		
		private function init(event: FlexEvent): void {
			configurarBotoes();
		}
		
		public function get barraBotoes(): BarraBotoesFormularioCadastro {
			return this._barraBotoes
		}
		
		[Bindable]
		public function set barraBotoes(barraBotoes: BarraBotoesFormularioCadastro): void {
			this._barraBotoes = barraBotoes;
		}
		
		public function get modo(): String {
			return this._modo;
		}
		
		public function set modo(modo: String): void {
			this._modo = modo;
		}
		
		public function get destino(): String {
			return this._destino;
		}
		
		public function set destino(destino: String): void {
			this._destino = destino;
		}
		
		public function get objetoSelecionado(): Object {
			return this._objetoSelecionado;
		}
		
		public function set objetoSelecionado(objetoSelecionado: Object): void {
			this._objetoSelecionado = objetoSelecionado;
		}
		
		public function get janelaSelecao(): ListaCadastro {
			return this._janelaSelecao;
		}
		
		public function set janelaSelecao(janelaSelecao: ListaCadastro): void {
			this._janelaSelecao = janelaSelecao;
		}
		
		private function configurarBotoes(): void {
			barraBotoes.btnOK.addEventListener(MouseEvent.CLICK, botaoOKPressionado);
			barraBotoes.btnLimpar.addEventListener(MouseEvent.CLICK, botaoLimparPressionado);
			barraBotoes.btnCancelar.addEventListener(MouseEvent.CLICK, botaoCancelarPressionado);
			barraBotoes.btnFechar.addEventListener(MouseEvent.CLICK, botaoFecharPressionado);
		}
		
		public function botaoOKPressionado(event: MouseEvent): void {
			var validacao: RealizarValidacao = realizarValidacao();
			if (!validacao.valido) {
				Alerta.showCampoObrigatorio(validacao.campoFoco);
			} else {
				var dto: SCReqDTO = new SCReqDTO();
				if (modo == MODO_INCLUIR) {
					incluirDados(montarDtoOperacao(dto));
				} else {
					alterarDados(montarDtoOperacao(dto));
				}
			}
		}
		
		protected function incluirDados(dto: SCReqDTO): void{
			ServicoJavaUtil.getServico(OPERACAO_INCLUIR_DADOS, this.destino, retornoOperacao, 
				MostraCursor.CURSOR_GRAVAR).getOperation(OPERACAO_INCLUIR_DADOS).send(dto);
		}
		
		protected function alterarDados(dto: SCReqDTO): void{
			ServicoJavaUtil.getServico(OPERACAO_ALTERAR_DADOS, this.destino, retornoOperacao,
				MostraCursor.CURSOR_GRAVAR).getOperation(OPERACAO_ALTERAR_DADOS).send(dto);
		}
		
		public function retornoOperacao(event: ResultEvent): void{
			Alerta.show("Operação realizada com sucesso!","Aviso", Alerta.TIPO_OK);
			fecharJanela();
		}		
		
		protected function montarDtoOperacao(dto: SCReqDTO): SCReqDTO{
			return dto;
		}
		
		public function botaoLimparPressionado(event: MouseEvent): void {
		}
		
		public function botaoCancelarPressionado(event: MouseEvent): void {
			if (modo == MODO_VISUALIZAR || modo == MODO_ALTERAR) {
				preencherCampos();
			} else {
				botaoLimparPressionado(event);
			} 
		}

		public function botaoFecharPressionado(event: MouseEvent): void {
			if(modo == MODO_ALTERAR && houveAlteracoes()){
				Alerta.show("Tem certeza que deseja sair sem salvar as alterações realizadas?", "AVISO",
					Alerta.TIPO_PERGUNTA,null, fecharJanela);
			}else{
				this.fecharJanela();
				
			}
		}
		
		public function fecharJanela(evt: MouseEvent = null): void{
			_janelaSelecao.botaoFecharFormularioCadastroPressionado(null);
		}
		
		public function preencherCampos(): void {
		}
		
		/**
		 * Verifica se houve alterações.
		 * 
		 * return 
		 * 		Retorna true se houve alterações, false para o contrário.
		 */
		protected function houveAlteracoes(): Boolean{
			return false;
		}
	}
}